/**
 * \file Principal.cpp
 * \brief Fichier test pour l'annuaire téléphonique
 * \author Pierre-Marc Levasseur, Simon Rodier
 * \version 0.1
 * \date juillet 2014
 *
 */

#include<gtest/gtest.h>
#include<iostream>
#include"Bottin.h"


using namespace std;
using namespace TP2P2;

TEST(Bottin, constructeurParDefaut_LeBottinEstVide)
{
	Bottin b;

	ASSERT_EQ(0, b.size());
	ASSERT_TRUE(b.estVide());
}

TEST(Bottin, ajouterPersonne_ajoutDUneSeulePersonne_LeBottinContientUnePersonne)
{
	Bottin b;

	int collisions = 0;
	b.ajouterPersonne("ABC", "DEF", "(999) 999-1000", "(888) 777-1111", "courrielABC", collisions);
	ASSERT_EQ(1, b.size());
	ASSERT_FALSE(b.estVide());
}

TEST(Bottin, ajouterPersonne_ajoutDePlusieursPersonnes_LeBottinContientPlusieursPersonnes)
{
	Bottin b;

	int collisions = 0;
	b.ajouterPersonne("QWE", "GHF", "(819) 999-1000", "(676) 111-2222", "QWE@hotmail.com", collisions);
	b.ajouterPersonne("ABC", "CDS", "(514) 555-1234", "(888) 333-3333", "ABC@hotmail.com", collisions);
	b.ajouterPersonne("ERT", "GFD", "(418) 222-2424", "(888) 443-1652", "ERT@hotmail.com", collisions);
//	cout<<"Test Bottin plusieurs personnes -- taille bottin = "<<b.size()<<endl;
	ASSERT_EQ(3, b.size());
	ASSERT_FALSE(b.estVide());

}

TEST(Bottin, ajouterPersonne_ajoutDunePersonneAvecTelInvalide_InvalidArgument)
{
	Bottin b;
	int collisions = 0;
	ASSERT_THROW(b.ajouterPersonne("QWE", "GHF", "(819) 99434", "(676) 111-2222", "QWE@hotmail.com", collisions), invalid_argument);
}

TEST(Bottin, ajouterPersonne_ajoutDunePersonneAvecTelNonStandard_BottinContientUnePersonne)
{
	Bottin b;
	int collisions = 0;
	b.ajouterPersonne("QWE", "GHF", "(819$++++9943455", "(676) 111-2222", "QWE@hotmail.com", collisions);
	ASSERT_TRUE(b.size()==1);
}

TEST(Bottin, rehash_ajoutDePlusieursPersonnes_LeBottinContientPlusieursPersonnes)
{
	Bottin b(3);

	// avec trois insertions le taux d'occupations sera dépassé et la méthode de rehachage sera apellée
	int collisions = 0;
	b.ajouterPersonne("QWE", "GHF", "(819) 999-1000", "(676) 111-2222", "QWE@hotmail.com", collisions);
	b.ajouterPersonne("ABC", "CDS", "(514) 555-1234", "(888) 333-3333", "ABC@hotmail.com", collisions);
	b.ajouterPersonne("ERT", "GFD", "(418) 222-2424", "(888) 443-1652", "ERT@hotmail.com", collisions);
	ASSERT_EQ(3, b.size());
	ASSERT_FALSE(b.estVide());
}

TEST(Bottin, constructeurAvecFichier_NombreDentreesValide)
{

	std::string nomFichier = "Bottin.txt";
	ifstream fichierBottin (nomFichier.c_str(), ios::in);
	int nbCollisions = 0;
	Bottin b(fichierBottin, nbCollisions);
	ASSERT_TRUE(b.size()==2438);

}


class BottinTest : public ::testing::Test
{
public:
	BottinTest():collisions(0), b()
	{
		b.ajouterPersonne("QWE", "GHF", "(819) 999-1000", "(676) 111-2222", "QWE@hotmail.com", collisions);
		b.ajouterPersonne("ABC", "CDS", "(514) 555-1234", "(888) 333-3333", "ABC@hotmail.com", collisions);
		b.ajouterPersonne("ERT", "GFD", "(418) 222-2424", "(888) 443-1652", "ERT@hotmail.com", collisions);
	}

	int collisions;
	Bottin b;
};

TEST_F(BottinTest, ajouterPersonne_ajoutDunePersonneQuiEstDejaDansLeBottin_LogicError)
{
	ASSERT_THROW(b.ajouterPersonne("ERT", "GFD", "(418) 222-2424", "(888) 443-1652", "ERT@hotmail.com", collisions), logic_error);
}

TEST_F(BottinTest, ajouterPersonne_ajouterPersonneAvecNumeroTelInvalide_InvalidArgument)
{
	ASSERT_THROW(b.ajouterPersonne("ERT", "GFD", "(4)", "(888) 443-1652", "ERT@hotmail.com", collisions), invalid_argument);
}

TEST_F(BottinTest, containsNomPrenom_RechercheDUnNomDejaDansLeBottin_renvoieTrue)
{
	ASSERT_TRUE(b.contains("ABC", "CDS"));
}

TEST_F(BottinTest, containsNomPrenom_RechercheDUnNomDejaDansLeBottin_renvoieTrue2)
{
	ASSERT_TRUE(b.contains("ERT", "GFD"));
}

TEST_F(BottinTest, containsNomPrenom_RechercheDUnNomPasDansLeBottin_renvoieFalse)
{
	ASSERT_FALSE(b.contains("AAA", "AAA"));
}

TEST_F(BottinTest, containsTelephone_RechercheDunTelDejaDansLeBottin_renvoieTrue)
{
	ASSERT_TRUE(b.contains("(819) 999-1000"));
}
TEST_F(BottinTest, containsTelephone_RechercheDunTelDejaDansLeBottin_renvoieTrue2)
{
	ASSERT_TRUE(b.contains("(418) 222-2424"));
}
TEST_F(BottinTest, containsTelephone_RechercheDunTelPasDansLeBottin_casNormal_renvoiFalse)
{
	ASSERT_FALSE(b.contains("(999) 999-9999"));
}
TEST_F(BottinTest, containsTelephone_RechercheDunTelPasDansLeBottin_casBizarre_lanceException)
{
	ASSERT_THROW(b.contains("()"), invalid_argument);
}
TEST_F(BottinTest, containsTelephone_RechercheDunTelDejaDansLeBottin_NumTelFormatNonStandard_renvoieTrue3)
{
	ASSERT_TRUE(b.contains("418222!!2?424"));
}

TEST_F(BottinTest, trouveAvecNomPrenom_RechercheDUnNomDansLeBottin_renvoieLesBonnesInformations)
{
	vector<string> info;

	info = b.trouverAvecNomPrenom("ABC", "CDS");

	ASSERT_EQ("(514) 555-1234", info[0]);
	ASSERT_EQ("(888) 333-3333", info[1]);
	ASSERT_EQ("ABC@hotmail.com", info[2]);
}

TEST_F(BottinTest, trouveAvecNomPrenom_RechercheDUnNomDansLeBottin_renvoieLesBonnesInformations2)
{
	vector<string> info;

	info = b.trouverAvecNomPrenom("ERT", "GFD");

	ASSERT_EQ("(418) 222-2424", info[0]);
	ASSERT_EQ("(888) 443-1652", info[1]);
	ASSERT_EQ("ERT@hotmail.com", info[2]);
}

TEST_F(BottinTest, trouveAvecNomPrenom_RechercheDunNomPasDansleBottin_logicError)
{
	ASSERT_THROW(b.trouverAvecNomPrenom("AAA", "BBB"), logic_error);
}

TEST_F(BottinTest, trouveAvecTelephone_RechercheDunTelDansBottin_renvoieBonnesInfo)
{
	vector<string> info;
	info = b.trouverAvecTelephone("(819) 999-1000");
//	cout<<info.size();
	ASSERT_EQ(info[0], "QWE");
	ASSERT_EQ(info[1], "GHF");
	ASSERT_EQ(info[2], "(676) 111-2222");
	ASSERT_EQ(info[3],"QWE@hotmail.com");
}

TEST_F(BottinTest, trouveAvecTelephone_RechercheDunTelDansBottinFormatNonStandard_renvoieBonnesInfo)
{
	vector<string> info;
	info = b.trouverAvecTelephone("819 9991000");
//	cout<<info.size();
	ASSERT_EQ(info[0], "QWE");
	ASSERT_EQ(info[1], "GHF");
	ASSERT_EQ(info[2], "(676) 111-2222");
	ASSERT_EQ(info[3],"QWE@hotmail.com");
}

TEST_F(BottinTest, trouveAvecTelephone_RechercheDunTelInvalide_invalidArgument)
{
	ASSERT_THROW(b.trouverAvecTelephone("819 991000"), invalid_argument);
}

TEST_F(BottinTest, trouveAvecTelephone_RechercheDunTelPasDansBottin_logicError)
{
	ASSERT_THROW(b.trouverAvecTelephone("(555) 555-0101"), logic_error);
}

TEST_F(BottinTest, trouveAvecTelephone_RechercheDunTelMauvaisFormat_invalidArgument)
{
	ASSERT_THROW(b.trouverAvecTelephone("()"), invalid_argument);
}










